package com.wzh.mall.product;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;


/*
* 1. 整合mybatis-plus
* 	1)、导入依赖
* 	2)、相关配置
* 		（1）、配置数据源
* 			1）、导入数据库的驱动
* 			2）、在application.yml中配置数据源相关信息
*
* 		（2）、配置mybatis-plus相关信息
* 			1）、使用 @MapperScan
* 			2）、告诉 mybatis-plus  sql映射位置
* 2. 逻辑删除
*	1). 配置全局的逻辑删除的规则
*	2). 配置逻辑删除的 Bean 加入到容器中  (现在不需要 低版本需要<3.1.0)
*	3). 实体类上加上 @TableLogic 注解
*
*
* 3. JSR 303
*	1). 给Bean添加校验注解  javax.validation.constraints  并定义自己的message提示
*	2). 开启校验功能 @Valid
*		效果：校验错误之后会有默认的响应400
*  	3). 其中BindingResult必须紧跟在需要校验的参数之后
*  	4). 分组校验（多场景的复杂校验）
*  		(1). 给校验注解标注什么时候需要校验
*  		@NotBlank(message = "品牌名必须提交！",groups = {AddGro.class,UpdateGro.class})
*  		(2). 在对应的controller中添加相应的 @Validated({AddGro.class})
*  		(3). 默认没有指定分组的校验注解，比如@NotBlank，在分组校验下不生效。只会在不分组的时候生效。
*	5). 自定义校验
*		(1). 编写一个自定义的校验注解
*		(2). 编写一个自定义的校验器
*		(3). 关联自定义的校验注解和自定义的校验器
*			@Documented
*			@Constraint(validatedBy = {ListValueConstraintValidator.class[此处可以指定多个不同的校验器，适配不同的校验] })
*			@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
*			@Retention(RUNTIME)
* 4. 统一的异常处理
*
* 5、模板引擎
* 	1）、thymeleaf-starter:关闭缓存
*   2）、静态资源都放在static文件夹下 并且配置	spring.mvc.static-path-pattern: /static/**
*   3）、页面放在templates下，直接访问。
*   4）、页面修改不重启服务器就可以实时更新
*   	1）、引入dev-tools
*
*   springboot访问项目的时候，默认会寻找index
*
* 6、整合redid
* 	1）、引入依赖
*   2）、简单配置redis的host信息
*   3）、使用StingRedisTemplate进行操作
*
* 7、整合redisson作为分布式锁的功能框架
*	1）、引入依赖
*	2）、配置redisson
*
* 8 整合springCache简化缓存开发
* 	1) 引入依赖
*		spring-boot-starter-cache spring-boot-starter-data-redis
*	2) 配置
*		(1) 自动配置了什么?
*			CacheAutoConfiguration  会导入->	RedisCacheConfiguration
*		    自动配置了缓存管理器 RedisCacheManager
*		(2) 配置使用redis作为缓存: spring.cache.type=redis
*	3) 测试缓存使用注解:
*		@Cacheable: 触发缓存填充. 将数据保存到缓存的操作
		@CacheEvict: 触发缓存驱逐。将数据从缓存中删除的操作 失效模式
		@CachePut: 在不干扰方法执行的情况下更新缓存。 不影响方法执行的前提下更新缓存 双写模式
		@Caching：重新组合要应用于方法的多个缓存操作。组合以上多个操作
		@CacheConfig：在类级别共享一些常见的缓存相关设置。
*		1) 开启缓存功能 @EnableCaching
*		2) 只需要使用注解就可以完成操作
*	4) 原理:
*		(1) CacheAutoConfiguration帮我们导入了RedisCacheConfiguration
*       (2) RedisCacheConfiguration帮我们配置了RedisCacheManager
*       (3) RedisCacheManager会帮我们初始化所有的缓存,
*       (4) 这个初始化缓存的过程,根据我们配置的cache名字进行配置,每个缓存决定使用什么配置,如果redisCacheConfiguration我们自己配置了
*       	就是用我们自己配置的,如果没有就是用默认的配置
*		(5) 如果我们想修改缓存的配置,就需要给容器中放一个RedisCacheConfiguration,
*			这个配置类就会应用到当前RedisCacheManager的所有缓存分区中.
*
*
* @ControllerAdvice
* */
@EnableRedisHttpSession
@EnableCaching
@EnableFeignClients(basePackages = "com.wzh.mall.product.feign")
@MapperScan("com.wzh.mall.product.dao")
@SpringBootApplication
@EnableDiscoveryClient
public class MallProductApplication {

	public static void main(String[] args) {

		SpringApplication.run(MallProductApplication.class, args);
		
	}

}
